package com.situ.personal.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.situ.personal.entity.User;

@WebFilter(filterName = "loginFilter", urlPatterns = {"/*"})
public class LoginFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		
		/**
		 * 1.用 HttpServletRequest 获取路径
		 * 2.用 HttpServletResponse 重定向
		 * 3.获取  浏览器  输入的访问路径  (拿到这个路径，对这个路径做拦截验证)
		 * // 4. 对特殊的请求不需要登录验证  ( 必须验证才能加载，，，现在不需要验证直接加载)
			// 1.js css png  属于html页面显示
			// 2.我要 跳转 登录页面  ,进行登录
			// 3.我要 执行 LoginServlet 登录控制层
			// 以上情况  均不拦截( 不需要登录, 拦截直接放行 执行 )
		 * 5. 其他访问路径  进行拦截(做登录验证)
		 */
		// 1.用 HttpServletRequest 获取路径
		HttpServletRequest httpServletRequest = (HttpServletRequest)request;
		// 2.HttpServletResponse 重定向
		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
		
		// 3.获取  浏览器  输入的访问路径
			// 打印测试
		String servletPath = httpServletRequest.getServletPath();
		System.out.println("servletPath : " + servletPath);
		
		
		// 4. 对特殊的请求不需要登录验证  ( 必须验证才能加载，，，现在不需要验证直接加载)
			// 1.js css png  属于html页面显示
			// 2.我要 跳转 登录页面  ,进行登录
			// 3.我要 执行 LoginServlet 登录控制层
		// 以上情况  均不拦截( 不需要登录, 拦截直接放行 执行 )
		
		//4.1.获取 js css png 后缀，，以这些个后缀结尾的请求    均不拦截
		int lastIndex = servletPath.lastIndexOf(".");
		String extension = ""; //后缀
		if (lastIndex != -1) { // 获取后缀
			extension = servletPath.substring(lastIndex); // .js   .css  .png
		}
		
		 // 4. 如果是这些情况，，，不进行拦截  直接访问 (直接通过 完成验证)
		if ("/user_login.jsp".equals(servletPath) 
				|| "/LoginServlet".contentEquals(servletPath)
				|| ".js".equals(extension)
				|| ".css".equals(extension)
				|| ".png".equals(extension)) {
			chain.doFilter(request, response);
		} else {// 5. 其他访问路径  进行拦截(做登录验证)    if没有登录重定向login.jsp页面 登录  （此时还会通过拦截层，咱们上面的判断，看到是访问login.jsp就不拦截，放行了）
			HttpSession session = httpServletRequest.getSession();
			User user = (User)session.getAttribute("user");
			// user是null，没有登录情况下，需要重定向到登录界面，但是访问user_login.jsp
			// 也会被拦截，也需要登录。问题就是：要去登录界面但是到登录界面要求你必须是登录状态。
			// 解决方法就是：给一些特殊的请求不进行登录验证，例如：user_login.jsp、/loginServlet
			if (user == null) {
				httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/user_login.jsp");
				return;
			}else { //5.其他访问路径  user ！= null   说明域对象有东西    是登录状态    放行
				// 
				chain.doFilter(request, response);
			}//小else
		}//大else
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}
